import csv

import pandas as pd
import os
from datetime import datetime


def 筛选(file_path):
    """
    读取并筛选CSV文件数据
    Args:
        file_path: CSV文件路径
    Returns:
        筛选后的DataFrame，如果处理出错则返回None
    """
    try:
        # 根据文件名判断是否需要跳过表头行
        header_row = 4 if file_path.endswith('_1.csv') else 0

        # 读取CSV文件
        df = pd.read_csv(file_path, header=header_row, encoding='utf-8')
        if df.empty:
            return None

        # 将最近发生时间(ST)列转换为datetime类型
        df['最近发生时间 (ST)'] = pd.to_datetime(df['最近发生时间 (ST)'])

        # 获取小时
        df['hour'] = df['最近发生时间 (ST)'].dt.hour
        # 筛选出不在1-5点之间的数据
        df = df[~df['hour'].between(1, 5)]
        # 删除临时的hour列
        df = df.drop('hour', axis=1)

        return df if not df.empty else None
    except Exception as e:
        print(f"处理文件 {file_path} 时出错: {str(e)}")
        return None


def process_directory(directory_path, output_file):
    """
    处理目录下所有CSV文件并写入结果
    Args:
        directory_path: 要处理的目录路径
        output_file: 输出文件路径
    """
    total_rows = 0
    is_first_file = True
    csv_columns = [
        "级别", "告警ID", "名称", "告警源", "定位信息", "附加信息",
        "最近发生时间 (ST)", "清除时间 (ST)", "确认时间 (ST)",
        "纤缆名称", "清除用户", "确认用户", "清除状态", "确认状态", "告警流水号"
    ]
    # 遍历目录下所有CSV文件
    for file in os.listdir(directory_path):
        if file.endswith('.csv'):
            file_path = os.path.join(directory_path, file)
            print(f"正在处理文件: {file}")

            df = 筛选(file_path)
            if df is not None:
                df = df[csv_columns]
                # 写入模式：第一个文件写入表头，后续文件追加
                df.to_csv(output_file,
                          mode='w' if is_first_file else 'a',
                          index=False,
                          header=is_first_file)

                file_rows = len(df)
                total_rows += file_rows
                print(f"文件 {file} 处理完成，筛选后保留 {file_rows} 行")
                is_first_file = False

    print(f"所有文件处理完成，总共保留 {total_rows} 行数据")
    print(f"数据已保存到: {output_file}")


def 被屏蔽(path):
    csv_columns = [
        "级别", "告警ID", "名称", "告警源", "定位信息", "附加信息",
        "最近发生时间 (ST)", "清除时间 (ST)", "确认时间 (ST)",
        "纤缆名称", "清除用户", "确认用户", "清除状态", "确认状态", "告警流水号"
    ]

    # 读取CSV文件
    df = pd.read_csv(path, skiprows=find_header_row_with_line_num(path))
    # 添加新列（如果不存在）
    for col in csv_columns:
        if col not in df.columns:
            df[col] = ''  # 或者用None或其他默认值

    # 按新顺序选择列
    df = df[csv_columns]
    df.to_csv(output_file,
              mode='a',
              index=False,
              header=False)


import csv


def find_header_row_with_line_num(file_path):
    """
    返回表头行及其行号（从1开始），跳过空行

    Args:
        file_path (str): CSV文件路径

    Returns:
        int: 表头行号（未找到返回None）
    """
    with open(file_path, 'r', encoding='utf-8') as file:
        reader = csv.reader(file)
        effective_line_num = 0  # 有效行号（跳过空行）

        for row in reader:
            # 检查行是否为空（全为空字符串或None）
            if not any(field.strip() for field in row):
                continue  # 跳过空行

            # 检查是否是表头行（第二列是"级别"）
            if len(row) > 1 and row[1] == '级别':
                return effective_line_num if effective_line_num == 0 else effective_line_num + 1
            effective_line_num += 1  # 仅非空行计数

        return None  # 未找到表头


if __name__ == '__main__':
    input_dir = r"D:\家宽\告警\hw\历史告警20250804094756083"
    output_file = r"D:\家宽\告警\hw\hw20250804.csv"
    # process_directory(input_dir, output_file)
    被屏蔽(r"D:\家宽\告警\hw\被屏蔽告警20250804105301926\被屏蔽告警20250804105301926_1.csv")
